-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Implement hash_map
macro
#144070
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Implement hash_map
macro
#144070
Conversation
This comment has been minimized.
This comment has been minimized.
3d020f6
to
b5692af
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Wouldn't using one of |
I was thinking about
|
All the options i mentioned should be equivalent to let len = 1 $(+ {stringify!($k); 1})*;
let mut map = HashMap::with_capacity(len);
$( map.insert($k, $v); )* HashMap::from([$(($k, $v)),*]) |
/// [`HashMap::new`]: crate::collections::HashMap::new | ||
/// [`HashMap::insert`]: crate::collections::HashMap::insert | ||
#[macro_export] | ||
#[allow_internal_unstable(hint_must_use)] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
you don't use of this feature (maybe it would make sense to?)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added it because it makes sense that if you create a hash map you must use it, otherwise don't create it, I don't see the point otherwise.
I don't think intrinsics make sense here, this is a library type. I think the repeat insert method makes the most sense as it doesn't have the potential stack usage problem of from. Repeat insert is also how extend is implemented under the hood: https://github.com/rust-lang/hashbrown/blob/670213fb32d208759d0331996894e05604de0c18/src/map.rs#L4562. with_capacity definitely makes sense though. You can count the elements like this: https://lukaswirth.dev/tlborm/decl-macros/building-blocks/counting.html |
Oh actually you might be able to use the unstable macro_metavar_expr_count for the counting too, I forgot about that :D |
I would go for the slice length approach, but resolved constantly, which is technically what I'm doing just that instead of making a variable using So probably macro_rules! hash_map {
() => {{
::std::collections::HashMap::new()
}};
( $( $key:expr => $value:expr ),* $(,)? ) => {{
let mut map = ::std::collections::HashMap::with_capacity(
const { [$($crate::hash_map!(@internal count $key)),*].len() }
);
$( map.insert($key, $value); )*
map
}};
(@internal count $i:tt) => {()}
} This would work best if there is some sort of thing inside the standard library so that the last branch is only used internally in an explicit way, which would also filter out the usage inside the second branch. |
You should try this, which I only remembered after posting the first message |
The problem with this is that it would delay stabilization a lot, so I'm not sure, I don't think adding unstable to unstable helps |
You're allowed to use unstable features internally with |
Would it be possible to use EDIT: or rather HashMap::with_capacity_and_hasher(capacity, Default::default()) for specifying capacity. |
Ok, I will check that now |
Implementation of #144032
Implements the
hash_map
macro understd/src/macros.rs
.